package rkdwogus7.basic;

public class J12_SungJuk_v4b {

	public static void main(String[] args) {
		// 접근 지정자를 이용해서 SungJuk 클래스 정의
		J12SungJuk sj = new J12SungJuk();
		// sj.name = "지현";
		// name 멤버변수는 접근지정자가 private이므로 위 코드처럼 작성하면 오류 발생!
		// 이렇게는 안돼. 생성자를 만드는 방법
		// 그리고 메서드를 만들어 사용하는 방법의 두 가지가 있어
		sj = new J12SungJuk("지현", 98, 45, 12);
		// 어쩔 수 없이 생성자를 이용해서 name, kor, eng, mat 멤버변수를 초기화 함
		// System.out.println(sj. ); 	: 넣을 수가 없지?
		// 하지만, 기존 방식으로 name 면수를 출력하려고 해도 private 접근 지정자 때문에
		// 오류 발생!
		
		// 따라서, private으로 선언된 멤버변수를 조작하거나 값을 읽어오려면
		// 그것을 위한 특별한 메서드를 작성하는 것이 좋음
		// 실무에서는 setter / getter 메서드를 작성함
		sj.setName( "수지" );       /* 여기에 setter 작성 후에 와서 정보 작성 */
		System.out.println( sj.getName() );   /* getter 작성 후에는 출력 가능 */
		//sj.setKor(98);
		System.out.println(sj.getKor());
		//sj.setEng(45);
		System.out.println(sj.getEng());
		//sj.setMat(12);
		System.out.println(sj.getMat());
		//sj.getTot();
		//System.out.println(sj.getTot());
/* 		출력문은 프로그램의 성능을 떨어뜨리기 때문에 이 방법보다 더 좋은 방법을 찾아볼거야 */
		
		// toString() method를 이용해서
		// 객체의 모든 멤버변수 출력하기
		System.out.println( sj.toString() );
		
		
		
	} // main

	
	
	
} // class

class J12SungJuk {
	private String name;
	private int kor;
	private int eng;
	private int mat;
	
	private int tot;
	private double avg;
	private char grd;
	
	
	public J12SungJuk() {  }
	public J12SungJuk(String name, int kor, int eng, int mat) {
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
	}
	// setter 메서드 : 멤버변수에 값을 setting 하기 위한 method
	// public void set멤버변수명(자료형 멤버변수명){
	// 		this.멤버변수명 = 멤버변수명;
	// }
	public void setName( String name ) {
		this.name = name;
	}          /* 이 setter를 만들고 위로 올라가서 그에 해당하는 정보 작성 */
	
	// getter method : 멤버변수의 값을 getting 하기 위한 method
	// public 멤버변수자료형 get멤버변수명( ) {
	//		return 멤버변수명;
	// }
	public String getName() {
		return name;
	}          /* 이 getter 메서드를 만들고 위에 가면 출력 가능 */
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getKor() {
		return kor;
	}
	
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getEng() {
		return eng;
	}
	
	public void setMat(int mat) {
		this.mat = mat;
	}
	public int getMat() {
		return mat;
	}
	
//	public void setTot(int tot) {
//		this.tot = tot;
//	}
	// 얘는 사실 쓸 이유가 없지.
	
	// 객체지향 프로그래밍에서는 메서드에 너무 많은 책임을 부여하는 것을 금지하고 있음
	// 예를 들어, getTot 메서드를 살펴보면 단순히 tot 변수의 값을 읽어오는 기능 외에
	// 입력한 성적 데이터에 대한 총점을 구하는 기능도 포함하고 있음
	// 그래서 이런 식으로 하나의 method에 잡다한 기능을 집어 넣으면 분석을 할 때
	// 어려워 질 수 있어. 팔방미인이 나쁜의미로 하나도 제대로 못한다는 의미가 되지
	// 물론, 자바랑 데이터베이스를 다 할 줄 아는것이 취업에 훨씬 유리하겠지만
	// 객체지향에서만큼은 이것을 배제하는거야.
	// 나중에 interface 만들면 기능을 따로 갖는 클래스와 값들을 갖는 클래스로
	// 나누게 될거야. 일단 지금은 열심히 만들어 둬.
	public int getTot() {
		tot = ( kor + eng + mat );
//		setTot( kor + eng + mat );     : 지금은 얘가 더 어려워 보이지?
//									       그러니까 지금 배우는 게 완벽하다고는 생각하지 마
		return tot;
	}
	
//	public void setAvg(double avg) {
//		this.avg = avg;
//	}
	// 얘도 굳이 할 이유가 없지.
	public double getAvg() {
		avg = ( tot / 3 );
		return avg;
	}
	
	public void setGrd(char grd) {
		this.grd = grd;
	}
	public char getGrd() {
		switch((int)avg/10) {
		case 10 : case 9 : grd = '수'; break;
		case 8 : grd = '우'; break;
		case 7 : grd = '미'; break;
		case 6 : grd = '양'; break;
		default : grd = '가';
		}
		return grd;
	}
	
	
	
	// 멤버변수의 모든 값을 출력하기 위해 object 클래스에서 기본으로 제공하는
	// method인 tostring()을 재정의override
	// 처음에 실행할 때 rkdwogus7.basic.J12SungJuk@1d62270 뜨는 이유
	
	@Override		// 어노테이션 : 컴파일러를 위한 주석
	public String toString() {
		String result = "";
		result = result + " 이름 :  " + name;
		result += " 국어 : " + kor;
		result += " 영어 : " + eng;
		result += " 수학 : " + mat;
		result += " 총점 : " + getTot();   // 호출을 해야 계산을 하는거야
		result += " 평균 : " + getAvg();   // 그냥 avg 해 봐야 계산을 못하지
		result += " 학점 : " + getGrd();   // 호출이 안 되어 있으니 계산 시작을 안하는거
		return result;
	}
	
	
}







